/**
 * 缓存工具类
 */
import {
	EXPIRE,
	SITE_TOKEN_KEY,
	PAGE_BACK_URL_KEY
} from "@/config/global.js";

class Cache{
	constructor(handler){
		this.cacheSetHandler = uni.setStorageSync;
		this.cacheGetHandler = uni.getStorageSync;
		this.cacheClearHandler = uni.removeStorageSync;
	}
	
	/**
	 * 获取当前时间
	 * @return {Number} 当前时间戳
	 */
	getNow() {
		return (new Date()).getTime();
	}
	
	/**
	 * 查看缓存是否过期
	 * @param {Number} time 时间戳
	 * @return {Boolean} true:未过期，false:过期
	 */
	isExpire(time) {
		// -1说明永久访问
		if(time == -1) return true; 
		// 非-1则要与当前时间比较，如果当前时间大于设置的过期时间则说明过期，反之；
		return !(this.getNow() > time);
	}
	
	/**
	 * 设置缓存
	 * @param {String} key 缓存key
	 * @param {Object} value 缓存值
	 * @param {Number} expire 过期时间
	 */
	set(key, value, expire = -1) {
		// 当没有传递expire时直接设置为-1
		const cache = {
			value: JSON.stringify(value),
			// -1说明永久访问，没有
			expire: expire < 0? expire : this.getNow() + expire
		};
		try{
			//设置缓存
			this.cacheSetHandler(key, JSON.stringify(cache));
			return true;
		} catch(e) {
			if(process.env.NODE_ENV === "development") console.error(`缓存${key}设置失败！`);
			return false;
		}
	}
	
	/** 
	 * 获取缓存
	 * @param {String} key
	 * @return {Object}
	 */
	get(key) {
		try {
			// 获取缓存字符串
			const cacheStr = this.cacheGetHandler(key);
			// 获取缓存对象
			const cache = JSON.parse(cacheStr);
			if(!cacheStr) return null;
			// 查看缓存是否过期
			// cache.expire：-1说明永久访问
			if(!this.isExpire(cache.expire)) {
				// 清除对应缓存
				this.clear(key);
				return null;
			}
			// 解析缓存值
			const value = JSON.parse(cache.value);
			return value;
		} catch (e) {
			// error
			if(process.env.NODE_ENV === "development") console.error(`缓存${key}获取失败！`);
			return null;
		}
	}
	
	/**
	 * 清除缓存
	 * @param {String} key
	 * @return {Boolean}
	 */
	clear(key) {
		try {
			this.cacheClearHandler(key);
			return true;
		} catch (e) {
			// error
			if(process.env.NODE_ENV === "development") console.error(`缓存${key}清除失败！`);
			
			return false;
		}
	}
	
	/**
	 * 设置带有默认时间的缓存
	 * @param {String} key
	 * @param {Object} value
	 */
	setDefaultExpire(key, value) {
		return this.set(key, value, EXPIRE);
	}
	
	/**
	 * 设置token
	 * @param {Object} value
	 */
	setToken(value) {
		return this.setDefaultExpire(SITE_TOKEN_KEY, value);
	}
	
	/**
	 * 清除token
	 */
	clearToken() {
		return this.clear(SITE_TOKEN_KEY);
	}
	
	/**
	 * 获取token
	 */
	getToken() {
		return this.get(SITE_TOKEN_KEY);
	}
	
	/**
	 * 清除返回缓存
	 */
	clearBackUrl() {
		return this.clear(PAGE_BACK_URL_KEY);
	}
}

export default new Cache;